템플릿 매개변수에 타입외의 값도 사용이 가능하다.
(모든 값이 허용되지는 않고 정수나 bool과 같은 타입만 가능)
포인터도 사용 가능함
template <typename T, int Size>
class fsize_vector{
using self=fsize_vector;
public:
using value_type=T;
const static int my_size=Size;
fsize_vector(int s=Size){ assert(s==Size); }
self& operator=(const self& that){
std::copy(that.data, that.data+Size, data);
return *this;
}
self operator+(const self& that) const{
self sum;
for(int i=0; i<my_size; ++i) sum[i]=data[i]+that[i];
return sum;
}
private:
T data[my_size];
}
위와 같은 벡터는 템플릿으로 사이즈를 전달하기 때문에 생성자에서 별도로 값을 받을 필요가 없다.
이전의 동적으로 크기를 정하는 벡터와 달리
템플릿으로 크기를 전달 받은 벡터는 크기가 이제 타입의 일부이며,
컴파일 타임에 접근할 수 있다.
컴파일러가 추가적으로 최적화 작업을 수행할 수 있다.
크기가 3인 벡터 2개를 추가하면 컴파일러는 반복문을 아래와 같이 세 문장으로 변환한다
(루프 풀기; loop unrolling)
self operator+(const self& that) const{
self sum;
sum[0]=data[0]+that[0];
sum[1]=data[1]+taht[1];
sum[2]=data[2]+taht[2];
return sum;
}
또한 컴파일 타임에 타입을 알고 있는 경우, fsize_vector가 단일 메모리 블록을 사용하도록
값을 배열에 저장할 수 있다.
(관리 비용이 많이 드는 동적 메모리 할당에 비해, 생성과 삭제과 훨씬 쉽다.)
fsize_vector<float, 3> v;
fsize_vector<float, 4> w;
vector<float> x(3), y(4);
v=w;
x=y;
만일 인수의 타입이 같다면 암시적으로 같은 크기를 같는다.
위의 v, w는 서로 다른 템플릿 인수를 가지기 때문에 허용되지 않음
(컴파일 중 걸러지기 때문에 assert()를 사용할 필요가 없다.)
template <typename T, int Size=3>
class fsize_vector{
}
fsize_vector<float> v, w, x, y;
fsize_vector<float, 4> space_time;
fsize_vector<float, 3> string;